package com.gjy.redis.util.scan;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;

import java.util.HashSet;
import java.util.Set;

/**
 * 高效遍历大型 Set
 *
 * @author gjy
 * @version 1.0
 * @since 2025-10-13 16:07:37
 */
public class SScanUtil {

    /**
     * 完整遍历 Set，返回所有成员（可加 MATCH 过滤）。
     *
     * @param jedis   Jedis 实例
     * @param key     Set 键名
     * @param pattern MATCH pattern（null / "" 表示全遍历）
     * @param count   每次返回的期望成员数
     */
    public static Set<String> sScanAll(Jedis jedis,
                                       String key,
                                       String pattern,
                                       int count) {
        Set<String> result = new HashSet<>();
        String cursor = ScanParams.SCAN_POINTER_START;

        ScanParams params = new ScanParams().count(count);
        if (pattern != null && !pattern.isEmpty()) {
            params.match(pattern);
        }

        while (!cursor.equals(ScanParams.SCAN_POINTER_START) || result.isEmpty()) {
            ScanResult<String> rs = jedis.sscan(key, cursor, params);
            result.addAll(rs.getResult());
            cursor = rs.getCursor();
        }
        return result;
    }

}
